package org.xx.armory.rpc.routing;

import java.util.LinkedHashMap;
import java.util.Map;

import static org.xx.armory.commons.Validators.notBlank;
import static org.xx.armory.commons.Validators.notNull;

/**
 * 用于在测试类中创建表示默认值和约束的{@link RouteData}的辅助类。
 */
public final class RouteDataBuilder {
    private Map<String, String> temp;

    /**
     * 构造辅助类。
     */
    public RouteDataBuilder() {
        this.temp = new LinkedHashMap<>();
    }

    /**
     * 添加新的键值对。
     *
     * @param key
     *         键。
     * @param value
     *         值。
     * @return 此辅助类本身。
     * @throws IllegalArgumentException
     *         如果参数{@code key}是{@code null}或者只包含空白字符，或者参数{@code value}是{@code null}。
     */
    public final RouteDataBuilder put(
            String key,
            String value
    ) {
        key = notBlank(key, "key").trim();
        value = notNull(value, "value");
        this.temp.put(key, value);

        return this;
    }

    /**
     * 使用所有已添加的键值对创建路由数据。
     *
     * @return 已构造的路由数据，此路由数据不与任何路由关联，仅用于表示默认值和约束。
     */
    public final RouteData build() {
        final RouteData ret = new RouteData(null);

        for (final Map.Entry<String, String> entry : this.temp.entrySet()) {
            ret.put(entry.getKey(), entry.getValue());
        }

        return ret;
    }
}
